15. 基数法则与组合数学初步

本节我们将聚焦计算各种有限集的基数,即集合内的元素数目。做到这一事情的底层思想是,依据 双射法则,我们希望能够建立集合到集合的双射,或是集合到序列的双射,从而将对一个集合元素的计数转移到其它更加容易统计的元素的计数。

再搭配上一系列十分简单明了到我们一直就在自发使用它们的计数法则,就能够对许多常见的集合进行计数。例如:

加法法则:设 A1,A2,,An 为一系列 不相交 集合,则

|i=1nAi|=i=1n|Ai|

乘法法则:设 P1,P2,,Pn 为任意集合列,则

|i=1nPi|=i=1n|Pi|

式中的“乘法”为笛卡尔积。

n 位仅由数字组成的 PIN 码共有 10n 个。此外,乘法法则解释了 特定长度的二进制串的个数。我们设 B={0,1},显然长度为 n 的二进制串可以表示为 Bn,依据乘法法则,|Bn|=2n

乘法法则可以借助双射法则在序列上重新阐述:

广义乘法法则:设 S 是许多长度为 k 的序列构成的集合,且对这些序列满足

|S|=i=1kni

广义乘法法则坚定了我们一个进行集合基数的方法:将集合计数映射到序列计数上。

我们称集合 S 的一个 排列(Permutation) 是一个 S 中所有元素出现一次且仅一次的序列,依据广义乘法法则,具有 n 个元素的集合共有 n! 个排列。阶乘函数也将在本节的后续内容中大量出现。

我们继续介绍另一个十分重要的计数法则:

除法法则:设 f 是一个 AB全函数,若 fk 对一的,则

|A|=k|B|

除法法则在我们使用映射将对 A 的计数转移到对 B 的计数,但发现 A 中每个元素都映射到 kB 中元素时,用于修正重复计数的问题。

例如,考虑下面的问题:我们要将 n 个人安排到圆桌上就坐。对各种不同的排座方法,若从某一个特定的人开始,顺时针转一圈得到相同的人物就坐序列,则我们称它们为同一种 安排(Arrangement)。如果我们固定开始排座的位置,显然我们能得到共有 n! 种排座方法。对于排座方法,我们令所有人移动到顺时针方向的下一把椅子就坐,显然能够发现排座对安排是 n 对一的,依据乘法法则,对 n 个人的圆桌排座问题共有 (n1)! 中安排。

还有一个基本问题:一个 n 元素集合 S 有多少个 k 元素子集?我们考虑 S 的一个排列,取其前 k 个元素组成我们想要的子集。显然,在该排列中,前 k 个元素的排列顺序与后 (nk) 个元素的排列顺序无关紧要,因此集合的排列到其 k 元素自己是 k!(nk)! 对一的,应用乘法法则,我们得到

子集法则:一个 n 元素集合的不同的 k 元素子集的数量为

n!k!(nk)!

我们称其为 组合数,又称 二项式系数,记为 (nk),又可记作 Cnk

了解了许多计数规则,我们来尝试应用一下吧!

例题

给定一副标准的扑克牌(不含大小王),任意抽出五张,有多少种符合“两对”[1]牌型的手牌?

错误做法

考虑构造一个六个元素的序列,分别代表第一个对子的点数、花色;第二个对子的点数、花色;单张的点数、花色。显然:

  • 第一个对子的点数有 13 种选择;
  • 第一个对子的花色有 (42) 种选择;
  • 第二个对子的点数有 12 种选择;
  • 第二个对子的花色有 (42) 种选择;
  • 单张的点数有 11 种选择;
  • 单张的花色有 4 种选择。
    故答案为
13×12×11×(42)2×4

但这个答案不对,它错在哪里?

有两个好办法可以避免上面的例题中可能会犯的重复计数错误:

  1. 对建立的映射多留点心眼,回头检查一下建立的映射是否真的是双射,如果不是,应用除法法则修正一下重复计数的问题。
  2. 用不同的方法再解决一边问题,只要两个方法都是正确的,那么结果也应该相同。

我们回顾一下组合数的引入过程,选出一个子集事实上是将集合分割为了两部分,因此我们自然会考虑将子集作多次分割共有多少种方案。形式化地,我们设 A 是一个 n 元素集合,A1,A2,,AkA 的一个划分,且 |Ai|=ci。称 A
的一个 (c1,c2,,ck) 分割为序列 (A1,A2,,Ak)。仿照得出组合数的方法,我们有

一个 n 元素集合的 (c1,c2,,ck) 分割数目为

(nc1,c2,,ck)=n!i=1kci!

其中 (nc1,c2,,ck) 称作 多项式系数

前面提到的排列计数都建立在元素各异的情况下。接下来我们考虑存在相同元素时排列的总数:给定元素序列 (e1,e2,,en),每个元素需在排列中出现次数的序列 (k1,k2,,kn),设 N=i=1nki。共有多少种排列?

我们使用子集分割的思想,考虑一个位置集合 {1,2,3,,n},将排列转化为对该集合作分割,并顺序给各个元素分配一个子集,因此我们得到

多重集和的排列:给定元素序列 (e1,e2,,en),每个元素需在排列中出现次数的序列 (k1,k2,,kn),其对应的排列个数为

(i=1nkik1,k2,,kn)

这种组合的思想容易联想到代数中加法对乘法的分配律,因此我们来考虑一下代数与组合数学中至关重要的定理:

二项式定理:对任意 a,bnN

(a+b)n=k=0n(nk)ankbk

这个公式的来源可以简单说明如下:我们不妨考虑 (1+x)n,考虑多项式乘法的过程,我们知道其完全展开会产生 2n 项,每一项为顺次从 n(1+x) 中选择 1 还是 n 相乘后的结果,这些项相加结果为一个 n 次多项式。因此对于其中的 k 次系数 ck,其应为在 n(1+x) 中选择了 kx(nk)1,因此这一项的系数就为 (nk)

通过应用上面提到过的 多重集合的排列,我们很容易将二项式定理推广到多项式定理:

多项式定理:对任意 x1,x2,,xnnN

(i=1nxi)n=k1,k2,,kmNk1+k2++km=n(nk1,k2,,km)i=1mxiki

鸽巢原理 同样是一个十分显然以至于我们一直在无意使用的计数原理案例:

鸽巢原理:如果鸽子的数量比鸽巢的数量多,则把所有鸽子放进鸽巢后必然有至少两只鸽子在一个巢中。形式化地来说,设 f 是一个 AB全函数,若 |A|>|B|,则 A 中至少有两个元素映射到 B 中同一个元素上。

鸽巢原理的逆否命题同样成立,其内容为,若 |A|>|B|,则不存在 AB满射

鸽巢原理可以自然推广:

广义鸽巢原理:若将 n 只鸽子放进 k 个鸽巢中,则必有一个鸽巢内至少有 nk 个鸽子。 形式化地来说,若 f 是一个 AB全函数,则 A 中至少有 |A||B| 个元素映射到 B 中同一个元素上。

应用鸽巢原理可以用于判定某些计数问题的下限。应用鸽巢原理时,务必搞清 鸽子鸽巢 分别对应哪个集合,以及将鸽子分配到鸽巢的方法。

加法法则 使用的条件是各集合两两不交,对于存在并集的集合,我们可以使用 容斥原理 来处理。容斥原理是加法法则的直接推广,其内容为:

两个集合的容斥原理:对任意有限集 A,B

|AB|=|A|+|B||AB|

对该公式的直观理解是,为了计算 |AB|,我们首先计算 |A|+|B|,但这会导致两集合的并集部分也就是 |AB| 被计算了两次,因此需要减去。

基于两个集合的容斥原理,可以自然推广到三个集合的情况:

三个集合的容斥原理:对任意有限集 A,B,C

|ABC|=|A|+|B|+|C||AB||BC||AC|+|ABC|

对该公式的理解可以画出三个集合的 Venn 图后按照与两个集合的容斥原理类似的方式进行。或者令 B=BC 代入两个集合的容斥原理验证。

一路推广下去,我们可以得到对任意数量集合的容斥原理:

容斥原理:对 n 个任意有限集 S1,S2,,Sn

|i=1nSi |=I{1,2,,n}(1)|I|+1|iISi|

直观解释就是,n 个集合交集的大小等于:

应用容斥原理,我们就可以给出关于 欧拉函数展开式 的另一种证明:

我们前面提到过 可以用多种思路解决同一道计数问题。由于不同思路给出的式子通常不同,我们可以进一步利用来导出一系列十分有用的式子,例如:

这种依据计数原理得到代数事实的方法称作 组合证明,其能够在不基于繁琐代数运算的情况下给出对某些式子的证明,其基本框架为:

  1. 定义一个集合 S
  2. 通过一种计数方式给出 |S|=P
  3. 通过另一种计数方式给出 |S|=Q
  4. 得出结论:P=Q

构建组合证明的关键为选择合适的 S,通常依据公式中较为简单的一侧确定。


  1. 两对是满足五张牌中有两对相同点数的牌的牌型。 ↩︎